# 导入工具装饰器库
from langchain_core.tools import tool
from pydantic import Field, BaseModel

# 定义防具方法 方式1。1 ： 加@tool注解 表示是langchain的工具方法
@tool
def multiply_1_1(a: int, b: int) -> int:
    """ 两个数相乘 """
    return a * b


print(f"multiply_1_1工具方法名称：{multiply_1_1.name}")
print(f"multiply_1_1工具方法描述：{multiply_1_1.description}")
print(f"multiply_1_1工具方法参数：{multiply_1_1.args}")
print(f"multiply_1_1工具方法return_direct(控制是否绕过LLM直接返回结果)：{multiply_1_1.return_direct}")
print(multiply_1_1.invoke({"a": 2, "b": 3}))


# 定义防具方法 方式1。2 ： 加@tool注解 定义字段描述 表示是langchain的工具方法  最终 方法名.args里 会多每个参数的描述
class CalculatorInput(BaseModel):
    a: int = Field(description="first number")
    b: int = Field(description="second number")


@tool("multiplicaton-tool", args_schema=CalculatorInput, return_direct=True)
def multiply_1_2(a: int, b: int) -> int:
    """ 两个数相乘 """
    return a * b


print(f"\n\nmultiply_1_2工具方法名称：{multiply_1_2.name}")
print(f"multiply_1_2工具方法描述：{multiply_1_2.description}")
print(f"multiply_1_2工具方法参数：{multiply_1_2.args}")
print(f"multiply_1_2工具方法return_direct(控制是否绕过LLM直接返回结果)：{multiply_1_2.return_direct}")
print(multiply_1_2.invoke({"a": 2, "b": 3}))


# 定义防具方法 方式1.3：异步工具方法 加@tool注解 表示是langchain的工具方法
@tool
async def async_multiply_1_3(a: int, b: int) -> int:
    """ 两个数相乘 """
    return a * b


print(f"\n\nasync_multiply_1_3工具方法名称：{async_multiply_1_3.name}")
print(f"async_multiply_1_3工具方法描述：{async_multiply_1_3.description}")
print(f"async_multiply_1_3工具方法参数：{async_multiply_1_3.args}")
print(f"async_multiply_1_3工具方法return_direct(控制是否绕过LLM直接返回结果)：{async_multiply_1_3.return_direct}")
# print(async_multiply_1_3.invoke({"a": 2, "b": 3}))
